import assert = require('assert');
import {FuncParse} from "../expressExt/FuncParse";


function testParse(a, b, c, d) {
    //注释
    let aaa = 1;

    /**
     * 注释2
     */
    aaa = (a + b);
    if (c === 1) {
        d = 2;
    }
    else
        c = "sas\"assa";

    return "sssss";
}

describe('FuncParse Test', function () {


    it('getFieldName', function () {
        assert.equal(FuncParse.getFieldName(r=>r.abcd), "abcd");
        assert.equal(FuncParse.getFieldName((r)=>r.abcd), "abcd");
        assert.equal(FuncParse.getFieldName((r)=> r.abcd), "abcd");
    });


    //
    // it('parseLexicalPositive', function () {
    //     for (let i = 0; i < 10000; i++) {
    //         let str = "";
    //         FuncParse.parseLexicalPositive(testParse.toString(), 0, (op, type, pos)=> {
    //            // str += " " + op;
    //         });
    //     }
    //
    // });
    //
    // it('parseLexicalPositive2', function () {
    //     for (let i = 0; i < 10000; i++) {
    //         let str = "";
    //         FuncParse.parseLexical(testParse.toString(), 0, (op, type, pos)=> {
    //            // str += " " + op;
    //         });
    //     }
    //
    // });


    it('parseLexical', function () {
        let str = "";
        FuncParse.parseLexicalPositive(testParse.toString(), 0, (op, type, pos)=> {
            str += " " + op;
        });
        assert.equal(str, " function testParse ( a , b , c , d ) { \n 注释 \n let aaa = 1 ; \n *\r\n     * 注释2\r\n      \n aaa = ( a + b ) ; \n if ( c === 1 ) { \n d = 2 ; \n } \n else \n c = sas\"assa ; \n return sssss ; \n }");


        str = "";
        let func = testParse.toString();
        FuncParse.parseLexical(func, func.length - 1, (op, type, pos)=> {
            str += " " + op;
        }, true);
        assert.equal(str, " } \n ; sssss return \n ; sas\"assa = c \n else \n } \n ; 2 = d \n { ) 1 === c ( if \n ; ) b + a ( = aaa \n *\r\n     * 注释2\r\n      \n ; 1 = aaa let \n 注释 \n { ) d , c , b , a ( testParse function");


        let pres = new FuncParse(testParse);
        assert.equal(pres.funcName, "testParse");
        assert.equal(pres.pos, 32);
        assert.equal(JSON.stringify(pres.paras), JSON.stringify(['a', 'b', 'c', 'd']));

        pres = new FuncParse(a=> {
        });
        assert.equal(pres.funcName, null);
        assert.equal(pres.pos, 4);
        assert.equal(JSON.stringify(pres.paras), JSON.stringify(['a']));

        pres = new FuncParse((a, b, c)=> {
        });
        assert.equal(pres.funcName, null);
        assert.equal(pres.pos, 12);
        assert.equal(JSON.stringify(pres.paras), JSON.stringify(['a', 'b', 'c']));
    });

});
